package com.hemj.common.utils.IdGenerator;


import java.util.HashMap;

import org.springframework.stereotype.Component;

/**
 * SnowFlake算法 53位Long类型生成唯一ID:表示生成从时间起点开始68年的id数据。
 * 第一位0，表明正数
 * 2-33，31位，表示秒时间差值，起始值自定义
 * 33-37，5位。表示机器码，（21-16）
 * 38-53，16位，sequenceBits 序列号位移数 毫秒内计数器 本机内存生成，性能高
 */

@Component
public class IdGeneratorFactory {

    //2022年6月16日0：0：0开始
    private final Long beginTs = 1655359359826L;
    private final Integer sequenceBits = 16;//序列号位移数
    private final Integer timeBits = 21; //时间差位移数
    private final Long sequenceMask = -1L ^ (-1L << sequenceBits); // 序列号ID最大值
    private HashMap<String, IdGenerator> generatorMap = new HashMap<String, IdGenerator>();
    private Long processId = 1l;//当前进程号


    public IdGeneratorFactory() {
    }

    public Long getId(String entityName) {
    	
        Long id = null;
        IdGenerator idGenerator = generatorMap.get(entityName);
        if (idGenerator == null){
        	idGenerator = new IdGenerator(beginTs, sequenceBits, timeBits, sequenceMask, processId);
        	generatorMap.put(entityName,idGenerator);
//        	processId++;
        }
        id=idGenerator.nextId();
        return id;
    }
    
}

